﻿using System;
using System.Collections;
using System.Data;
using System.Data.OleDb;
using System.Drawing;
using System.Windows.Forms;

namespace DiaryPlanner
{


    public partial class Account : UserControl
    {

        public ArrayList AccList = new ArrayList();
        public AccPost nowAccPost;
        public string radio="day";
        public Account()
        {
            InitializeComponent();
            dateLabel.Text = monthCalendar1.SelectionStart.Year.ToString() + "년 " +
                             monthCalendar1.SelectionStart.Month.ToString() + "월 " +
                             monthCalendar1.SelectionStart.Day.ToString() + "일";
            initAcc_db(dateLabel.Text);
            
        }

        //private void btnAccNew_Click(object sender, EventArgs e)
        //{

        //}
        public void skinSet()
        {
            string skin = UserProfile.Instance().setting;
            if (skin == "b")
            {
                this.BackColor = System.Drawing.Color.PaleTurquoise;

            }
            else if (skin == "c")
            {
                this.BackColor = System.Drawing.Color.LawnGreen;
            }
            else if (skin == "d")
            {
                this.BackColor = System.Drawing.Color.MistyRose;

            }
            else
            { //skin=="a"
                this.BackColor = System.Drawing.SystemColors.ControlLight;

            }
        }

        public void viewAllAcc()
        { 

            //Accsize 216*276

            AccPanel.Controls.Clear();
            int count = AccList.Count;

            foreach (AccPost mp in AccList)
            {
                count--;
                AccPost nmp = mp;

                //mp.AccText.BackColor = System.Drawing.Color.Yellow;
                AccPanel.Controls.Add(mp);
                mp.Location = new Point(6, 6 + 20 * (count));

            }

        }

        private void btnNewAcc_Click(object sender, EventArgs e)
        {
            AccNew AccNewObject = new AccNew(this);//새 메모를 입력하는 다이얼로그
            AccNewObject.ShowDialog();
            initAcc_db(dateLabel.Text);
        }
        private void initAcc_db(String date)
        {
            AccList.Clear();
            try //예외처리문
            {
                string connectionString = "provider=Microsoft.JET.OLEDB.4.0;" //연결하는 객체의 공급자명(확장자명)
                                        + "data source = "  //데이터 소스=(경로입력하라는거)
                                        + Application.StartupPath ///상대경로 읽어옴
                                        + @"\diaryplannerdb.mdb";//실제 데이터베이스 파일이름
                string commandString = "";
                if(radio.Equals("day")) commandString = "Select * from [unreg_acc] where Udate = '" + date +"'";
                else commandString = "Select * from [unreg_acc] where Udate like '" + date.Substring(0, 9) + "%'";
                string commandString2 = "";
                if (radio.Equals("day")) commandString2 = "Select * from [reg_acc] where pay_date = '" + date.Split(' ')[2] + "'";
                else commandString2 = "Select * from [reg_acc]";
                //unreg_acc테이블에 있는 모든필드들을 모두 검색해라.
                //string commandString2 = "Select * from [reg_acc] where payday = '" + monthCalendar1.SelectionStart.Day + "'";
                OleDbDataAdapter DBAdapter ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter);

                DataSet DS = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter.Fill(DS, "unreg_acc"); //DS라는 데이터셋에 새로운 Accs 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable = DS.Tables["unreg_acc"];//home테이블을 불러와 aTable을 새로 생성해서 저장


                OleDbDataAdapter DBAdapter2 ////DataSet을 채우고 데이터 소스를 업데이트하는 데 사용되는 데이터 명령 집합 및 데이터베이스 연결하게 하는 함수
                    = new OleDbDataAdapter(commandString2, connectionString);//connectionString이라는 경로와 쿼리명령을 동적할당

                OleDbCommandBuilder myCommandBuilder2 ///연결된 데이터베이스에서 DataSet의 변경 내용을 조정하는 데 사용되는 단일 테이블 명령을 자동으로 생성합니다
                    = new OleDbCommandBuilder(DBAdapter2);

                DataSet DS2 = new DataSet(); //DS라는 데이터 셋 동적할당

                DBAdapter2.Fill(DS2, "reg_acc"); //DS라는 데이터셋에 새로운 Accs 테이블에 추가 또는 갱신하겠다고 알림.

                DataTable aTable2 = DS2.Tables["reg_acc"];//home테이블을 불러와 aTable을 새로 생성해서 저장

                //DBAdapter.Fill(aTable);
                int sum = 0;
                for (int i = 0; i < aTable.Rows.Count; i++)
                {
                    if (aTable.Rows[i].ItemArray[6].ToString() == UserProfile.Instance().userId)
                    {
                        add_Acc(aTable.Rows[i].ItemArray[0].ToString(), aTable.Rows[i].ItemArray[1].ToString(), aTable.Rows[i].ItemArray[2].ToString(), aTable.Rows[i].ItemArray[3].ToString(), aTable.Rows[i].ItemArray[5].ToString());
                        if (int.Parse(aTable.Rows[i].ItemArray[4].ToString()) == 1) sum += int.Parse(aTable.Rows[i].ItemArray[5].ToString());
                        else sum -= int.Parse(aTable.Rows[i].ItemArray[5].ToString());
                    }
                }
                for (int i = 0; i < aTable2.Rows.Count; i++)
                {
                    if (aTable2.Rows[i].ItemArray[6].ToString() == UserProfile.Instance().userId)
                    {
                        add_Acc(aTable2.Rows[i].ItemArray[0].ToString(), aTable2.Rows[i].ItemArray[1].ToString(), aTable2.Rows[i].ItemArray[2].ToString() + " " + aTable2.Rows[i].ItemArray[3].ToString(), aTable2.Rows[i].ItemArray[4].ToString(), aTable2.Rows[i].ItemArray[5].ToString());
                        if (int.Parse(aTable2.Rows[i].ItemArray[4].ToString()) == 1) sum += int.Parse(aTable2.Rows[i].ItemArray[5].ToString());
                        else sum -= int.Parse(aTable2.Rows[i].ItemArray[5].ToString());
                    }
                }
                sumValue.Text = sum.ToString();
                this.viewAllAcc();
            }
            catch (DataException DE) //DataException에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message); //DataExpception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
            catch (Exception DE) //Exception에러 발생확인하는 catch문
            {
                MessageBox.Show(DE.Message);//Expception 에러 발생시 메세지박스로 에러값을 출력해라.
            }
        }

        private void monthCalendar1_DateSelected(object sender, DateRangeEventArgs e)
        {
            dateLabel.Text = monthCalendar1.SelectionStart.Year.ToString() + "년 " +
                             monthCalendar1.SelectionStart.Month.ToString() + "월 " +
                             monthCalendar1.SelectionStart.Day.ToString() + "일";

            initAcc_db(dateLabel.Text);
        }


        private void add_Acc(string date, string name, string type, string category, string price)
        {
            AccPost thisAccPost = new AccPost(this);
            thisAccPost.AccCode.Text = date;
            thisAccPost.label1.Text = price+"원";
            thisAccPost.label2.Text = name;
            thisAccPost.label3.Text = type;
            if (category == "1") thisAccPost.label4.Text = "월수입";
            else if (category == "0") thisAccPost.label4.Text = "월지출";
            else thisAccPost.label4.Text = category;

            this.AccList.Add(thisAccPost);//Accpost 배열에 추가
            
        }

        private void goRegBtn_Click(object sender, EventArgs e)
        {
            Regular RegularObject = new Regular();//새 메모를 입력하는 다이얼로그
            RegularObject.ShowDialog();
        }

        private void dayRadio_CheckedChanged(object sender, EventArgs e)
        {
            radio = "day";
            initAcc_db(dateLabel.Text);
        }

        private void monRadio_CheckedChanged(object sender, EventArgs e)
        {
            radio = "mon";
            initAcc_db(dateLabel.Text);
        }

        private void accRef_Click(object sender, EventArgs e)
        {
            initAcc_db(dateLabel.Text);
        }



    }
}
